table of contents
RENAME(2) | Руководство программиста Linux | RENAME(2) |
ИМЯ¶
rename - изменить имя или расположение файла
КРАТКАЯ СВОДКА¶
#include <unistd.h>
int rename(const char *oldpath, const char *newpath);
ОПИСАНИЕ¶
rename переименовывает файл, перемещая его между каталогами, если требуется.
Все прочие жесткие ссылки на файл (созданные с помощью link(2)) не изменяются.
Если newpath уже существует, то он будет атомарно перезаписан (при определенных условиях - смотри ОШИБКИ ниже), так что нет ни одной точки, когда другой процесс, пытающийся обратиться к newpath, не обнаружит его.
Если newpath существует, но операция завершается неуспешно или система аварийно завершает работу, rename гарантируется, что newpath останется нетронутым.
При перезаписи, однако, вероятно будет окно, в котором oldpath и newpath ссылаются на один и тот же файл.
Если oldpath является символической ссылкой, то она переименовывается; если newpath является символической ссылкой, то будет перезаписан файл, на который она указывает.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
В случае успеха возвращается ноль. При ошибке возвращается -1, а errno устанавливается должным образом.
ОШИБКИ¶
- EISDIR
- newpath является существующим каталогом, но oldpath не является каталогом
- EXDEV
- oldpath и newpath находятся на разных файловых системах.
- ENOTEMPTY
- newpath является непустым каталогом.
- EBUSY
- newpath существует и является текущим рабочим каталогом или корневым каталогом какого-то процесса.
- EEXIST
- Новое имя пути совпадает с началом старого имени.
- EINVAL
- Попытка сделать каталог своим собственным подкаталогом.
- EMLINK
- oldpath уже имеет максимальное количество ссылок на него, или это был каталог, а каталог, содержащий newpath, уже имеет максимальное количество ссылок.
- ENOTDIR
- Компонент, используемый как каталог в oldpath или newpath в действительности не является каталогом.
- EFAULT
- oldpath или newpath указывают за пределы доступного адресного пространства.
- EACCES
- Запись в каталог, содержащий oldpath или newpath не разрешена для эффективного uid'а процесса, или один из каталогов в oldpath или newpath не позволяет производить поиск (выполнять), или oldpath был каталогом и не позволял запись в него (необходимую, чтобы обновить ..).
- EPERM
- Каталог, содержащий oldpath, имеет sticky-bit, а эффективный uid процесса не равен ни uid'у файла, который нужно удалить, ни uid'у каталога, который его содержит, или файловая система, содержащая pathname, не поддерживает переименование запрошенного типа.
- ENAMETOOLONG
- oldpath или newpath слишком длинны.
- ENOENT
- Одна из частей каталога в oldpath или newpath не существует или является "висячей" символической ссылкой.
- ENOMEM
- Ядру не хватило памяти.
- EROFS
- Файл находится на файловой системе, смонтированной только для чтения.
- ELOOP
- oldpath или newpath содержат зацикленную символическую ссылку, то есть при ее подстановке происходит ссылка на нее саму.
- ENOSPC
- На устройстве, содержащем файл, нет места для новой записи в каталоге.
СООТВЕТСТВУЕТ¶
POSIX, 4.3BSD, ANSI C
ОШИБКИ¶
На файловых системах NFS вы не можете исходить из предположения, что если операция завершилась неудачно, то файл остался не переименованным. Если сервер совершает операцию rename, а затем аварийно останавливается, то перепосланный пакет RPC будет опять обработан, когда сервер восстановит работу, и это вызовет ошибку. Приложение должно справиться с этой ситуацией. См. link(2) за описанием подобной проблемы.
СМОТРИ ТАКЖЕ¶
link(2), unlink(2), symlink(2), mv(1), link(8).
ПЕРЕВОД¶
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999-2000
24 July 1993 | Linux 0.99.7 |